const path = require('path')
const { getFileJsonData } = require('../utils/file_utils')
const WebSocket = require('ws')
// 创建WebSocket服务端的对象，绑定的端口号是9999
const wss = new WebSocket.Server({
  port: 9999,  // 端口号
})

module.exports.listen = () => {
  // 对客户端的连接事件进行监听
  // client:代表的是客户端的连接socket对象
  wss.on('connection', (client) => {
    console.log('有客户端连接了！')
    // 对客户端的连接事件进行message事件的监听
    // msg：有客户端发给服务端的数据
    client.on('message', async (msg) => {
      // console.log('接收到了前端发送的消息:', msg)
      // // 由服务端向客户端发送数据(推送数据)
      // // 发送过去的数据是Blob类型的，前端用不了
      // // 第一种方法
      // // client.send(String(msg)) // 将接收到的消息转换成字符串再推送给前端
      // // 第二种方法
      // client.send(msg, {
      //   binary: false // 不使用二进制发送数据
      // })

      // 将客户端的代码解析成对象
      let payload = JSON.parse(msg)  // 客户端发送改过来的数据(配置对象属性)
      // 提取消息中的action属性的值(哪个图表的数据)
      const action = payload.action
      if (action === 'getData') {
        // 相对路径
        let fullPath = '../data/' + payload.chartName + '.json'
        // 绝对路径
        fullPath = path.join(__dirname, fullPath)
        // 获取数据库中的数据
        let res = await getFileJsonData(fullPath) // 给客户端发送服务端的数据(图表数据)
        console.log('接收到了前端发送的消息:', payload)
        // 需要在服务端获取到数据的基础之上，增加data字段
        // data对应的值吗，就是某个json文件的内容
        payload.data = res
        client.send(JSON.stringify(payload))
      } else {
        // 原封不动的将所接收到的数据转发给每一个处于连接状态的客户端
        // 遍历所有客户端的连接
        wss.clients.forEach((item) => {
          item.send(msg, {
            binary: false
          })
        })
      }
    })
  })
}

// file:///G:/%E5%BC%A0%E5%90%91%E9%98%B3/%E5%BC%A0%E5%90%91%E9%98%B3%E7%BB%BC%E5%90%88%E6%96%87%E4%BB%B6/Echarts/online-retailers-master/%E7%AC%AC%E5%85%AD%E5%A4%A9%E7%B4%A0%E6%9D%90/02.%E7%AC%94%E8%AE%B0/04.%E6%95%B0%E6%8D%AE%E5%8F%AF%E8%A7%86%E5%8C%96_%E5%89%8D%E7%AB%AF%E9%A1%B9%E7%9B%AE%E5%AE%9E%E7%8E%B0%E6%AD%A5%E9%AA%A4.pdf